'''
Description: 
Author: Zilu
Date: 2021-11-09 15:58:47
Version: 
LastEditTime: 2021-12-08 21:36:22
LastEditors: Zilu
'''

# 变量在内存中变成可存储或者可传输的过程称为序列化，python称为pickling，
# 其他语言也称serialization，marshalling，flattening
# 将序列化的内容变成内存中可读的形式称为反序列化，unpickling
# python 用 pickle 模块实现序列化
import pickle
d = dict(name='Bob', age=20, score=88)
pickle.dumps(d)     # bytes 形式的数据

f = open("dump.txt",'wb')
f.write(pickle.dumps(d))
f.close()

f = open("dump.txt",'rb')
d1 = pickle.load(f)

# 注意dump、dumps、load、loads的区别

# json 是序列化更好的方案
import json
json_str = json.dumps(d)       # str 类型的数据
json.dump()

json_str1 = json.loads(json_str)    
json_str1   

# json的标准编码是 UTF-8，所以我们总是能正确地在Python的str与JSON的字符串之间转换。

# 一般的class实例不能json序列化，因为json的dumps不知道如何对不同的类实例序列化
# 不过可以给dumps传入序列化的方法，或者干脆把实例变成字典，因为class一般都内置__dict__方法
class Student(object):
    def __init__(self,name,age,score) -> None:
        super().__init__()
        self.name = name
        self.age = age
        self.score = score

    def student2str(self,s):
        return {
            'name': self.name,
            'age': self.age,
            'score': self.score
        }

s = Student("Bob",15,88)
print(json.dumps(s, default=Student.student2str))

print(json.dumps(s, default=lambda obj: obj.__dict__))

# 少数class中不存在__dict__，如定义了__slots__的class

# 练习：对中文进行JSON序列化时，json.dumps()提供了一个ensure_ascii参数，观察该参数对结果的影响
obj = dict(name='小明', age=20)
s = json.dumps(obj, ensure_ascii=False)

